#include "EstadoDeRefuerzoYReubicacion.h"
#include "ColocacionDeEjercitosInvalidaException.h"
#include "JuegoServerImp.h"

EstadoDeRefuerzoYReubicacion::EstadoDeRefuerzoYReubicacion(EstadoDeRealizacionDePartida* realizacionDePartida)
{
	this->realizacionDePartida = realizacionDePartida;
}

void EstadoDeRefuerzoYReubicacion::reforzarEjercitos(Jugador* jugador) {
		
	//Agrego ejercitos en funcion de la cantidad de territorios controlados.
	unsigned int numeroDeEjercitos = (realizacionDePartida->getJuego()->getMapa()->getTerritoriosEnPoderDeJugador(jugador->getColor()) / 3);
	if (numeroDeEjercitos < 3)
		numeroDeEjercitos = 3;
	//Agrego ejercitos en funcion de la cantidad de continentes ocupados.
	map<string,Continente*>* continentes = realizacionDePartida->getJuego()->getMapa()->obtenerContinentes();
	for (map<string,Continente*>::iterator it = continentes->begin(); it != continentes->end(); it++)
		if (it->second->enPoderDeJugador(jugador->getColor()))
			numeroDeEjercitos += it->second->getBonus();
	
	jugador->asignarEjercitos(numeroDeEjercitos);
	
}

void EstadoDeRefuerzoYReubicacion::colocarEjercitos(Jugador* jugador, Territorio* territorio, unsigned int cantidadDeEjercitos) {
	if (!(jugador->getCantidadDeEjercitos() >= cantidadDeEjercitos))
		throw ColocacionDeEjercitosInvalidaException("No dispones de tal cantidad de ejercitos.");
	else {
		if (territorio->getEnPoderDe() == jugador->getColor()) {
			territorio->colocarEjercitos(cantidadDeEjercitos,jugador->getColor());
			jugador->quitarEjercitos(cantidadDeEjercitos);
			if (jugador->getCantidadDeEjercitos() == 0)
					realizacionDePartida->setEstado(realizacionDePartida->getEstadoDeAtaque());
		}
		else
			throw ColocacionDeEjercitosInvalidaException("El territorio esta en poder de "+territorio->getEnPoderDe());
	}
}

string EstadoDeRefuerzoYReubicacion::toString() {
	return "EstadoDeRefuerzoYReubicacion";
}

EstadoDeRefuerzoYReubicacion::~EstadoDeRefuerzoYReubicacion()
{
}
